#!/user/bin/env python
# -*- coding: utf-8 -*-
# @Software: PyCharm
# @Time : 2021/05/07 14:16
# @Author : ziqi.zhang
# @Version : 1.0.0
# @Description : 构造邮件，发送邮件类

import smtplib
import logging
from email import encoders
from email.header import Header
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart


class Email:
    def get_email_obj(self, email_subject, email_from, to_addr_list):
        """
        构造邮件对象，并设置邮件主题、发件人、收件人，最后返回邮件对象
        :param email_subject:邮件主题
        :param email_from:发件人
        :param to_addr_list:收件人列表
        :return :邮件对象 email_obj
        """
        # 构造 MIMEMultipart 对象做为根容器
        email_obj = MIMEMultipart()
        email_to = ','.join(to_addr_list)  # 将收件人地址用“,”连接
        # 邮件主题、发件人、收件人
        email_obj['Subject'] = Header(email_subject, 'utf-8')
        email_obj['From'] = Header(email_from, 'utf-8')
        email_obj['To'] = Header(email_to, 'utf-8')
        return email_obj

    def attach_content(self, email_obj, email_content, content_type='plain', charset='utf-8'):
        """
        创建邮件正文，并将其附加到跟容器：邮件正文可以是纯文本，也可以是HTML（为HTML时，需设置content_type值为 'html'）
        :param email_obj:邮件对象
        :param email_content:邮件正文内容
        :param content_type:邮件内容格式 'plain'、'html'..，默认为纯文本格式 'plain'
        :param charset:编码格式，默认为 utf-8
        :return:
        """
        content = MIMEText(email_content, content_type, charset)  # 创建邮件正文对象
        email_obj.attach(content)  # 将邮件正文附加到根容器

    def attach_part(self, email_obj, source_path, part_name):
        """
        添加附件：附件可以为照片，也可以是文档
        :param email_obj:邮件对象
        :param source_path:附件源文件路径
        :param part_name:附件名
        :return:
        """
        part = MIMEBase('application', 'octet-stream')  # 'octet-stream': binary data   创建附件对象
        part.set_payload(open(source_path, 'rb').read())  # 将附件源文件加载到附件对象
        encoders.encode_base64(part)
        part.add_header('Content-Disposition', 'attachment; filename="%s"' % part_name)  # 给附件添加头文件
        email_obj.attach(part)  # 将附件附加到根容器

    def send_email(self, email_obj, email_host, host_port, from_addr, pwd, to_addr_list):
        """
        发送邮件
        :param email_obj:邮件对象
        :param email_host:SMTP服务器主机
        :param host_port:SMTP服务端口号
        :param from_addr:发件地址
        :param pwd:发件地址的授权码，而非密码
        :param to_addr_list:收件地址
        :return:发送成功，返回 True；发送失败，返回 False
        """
        try:
            '''
                # import smtplib
                # smtp_obj = smtplib.SMTP([host[, port[, local_hostname]]] )
                    # host: SMTP服务器主机。
                    # port: SMTP服务端口号，一般情况下SMTP端口号为25。
                # smtp_obj = smtplib.SMTP('smtp.qq.com', 25)
            '''
            smtp_obj = smtplib.SMTP_SSL(email_host, host_port)  # 连接 smtp 邮件服务器
            smtp_obj.login(from_addr, pwd)  # 登录邮箱
            smtp_obj.sendmail(from_addr, to_addr_list, email_obj.as_string())  # 发送邮件：email_obj.as_string()：发送的信息
            smtp_obj.quit()  # 关闭连接
            logging.info("邮件发送成功！")
            return True
        except smtplib.SMTPException:
            logging.error("邮件发送失败！", exc_info=True)
            return False
